<?php 
defined('BASEPATH') OR exit('No direct script access allowed');

require_once 'vendor/autoload.php';
// 引入鉴权类
use Qiniu\Auth;
// 引入上传类
use Qiniu\Storage\UploadManager;

/**
 * 附件、文件上传函数库
 * 
 * @desc 
 * @version 1.0.0 
 * @author  Jason
 * @date	2017年5月22日 上午11:07:52
 */
class Lib_attachment
{
	/** @var CI_Controller */
	private $CI;
	
	/** @var Mod_attachment */
	private $mod_attachment = null;
	
	function __construct()
	{
		$this->CI =& get_instance();
		
		$this->CI->load->config('attachment');
	}
	
	/**
	 * 上传到本地
	 * 
	 * @desc    description
	 * @author  Jason
	 * @date    2017年5月22日 下午12:58:27
	 * 
	 * @param   string $field
	 * @param   string $filter
	 * 
	 * @return  [<status>, <content>]	一个两元素数组，第一个元素表示状态，第二个表示相应内容
	 * 	        eg:	[true, <userData>]
	 * 				[false, <errorMesg>]
	 */
	function local_upload($field = 'userfile', $filter = 'common'/*'image'*/)
	{
		# $params = $this->CI->config->item('image');
		# $this->CI->load->library('upload', $params);
		$config = $this->CI->config->item($filter);
		$this->CI->load->library('upload', []); // NOT NULL NOR? FALSE
		$this->CI->upload->initialize($config);
		
		$status = false;
		$content = [];
		// 根据你设置的参数上传文件
		if(FALSE === $this->CI->upload->do_upload($field)) {
			// 上传失败，获取错误信息
			# $errorKey = explode("\n", trim(validation_errors(null, null)));
			# or$errorKey = $this->CI->form_validation->error_array();
			$errorKey = explode("\n", trim($this->CI->upload->display_errors(null, "\n")));
			$status = false;
			$content = $errorKey;
		} else {
			$status = true;
			// 上传成功，获取上传的文件的所有信息
			// 后获取文件保存路径
			$data = $this->CI->upload->data();
			// 记录日志 - 插入日志
			$content = $data;
		}
		
		return [$status, $content];
	}
	
	/**
	 * 上传图片到七牛
	 * 
	 * @desc    description
	 * @author  Jason
	 * @date    2017年5月22日 下午1:59:21
	 * 
	 * @param   string $field
	 * @param   string $filter
	 * 
	 * @return  [<status>, <content>]	一个两元素数组，第一个元素表示状态，第二个表示相应内容
	 * 	        eg:	[true, <userData>] // access_url
	 * 				[false, <errorMesg>]
	 */
	public function qiniu_upload($field = 'userfile', $filter = 'common')
	{
		list($status, $content) = $this->local_upload($field, $filter);
		
		if(!$status) {
			return [$status, $content];
		} else {
			// 获取七牛配置信息
			$config = $this->CI->config->item('qiniu');
			// 初始化 UploadManager 对象并进行文件的上传
			$uploadManager = new UploadManager();
			// 要上传的空间
			$bucket = $config['bucket_name_base'];
			// 上传策略
			$policy = array(
					#'callbackUrl' => 'http://apptest.ninebot.cn/lintest/back.php',
					#'callbackBodyType' => 'application/json',
					#'callbackBody' => '{"video_attach_id":"123456","persistentId":$(persistentId),"hash":$(hash),"filename":$(key),"type":"video","filesize": $(fsize)}',  //设置application/json格式回调
					
					// 设置 application/json 格式回调
					// 注意数据类型：非树形魔法变量可以放在双引号内，但是会被强制转换成字符串！树形数据还会破坏 JSON 的解析！！
					// eg: "exif":"null","imageInfo":"{"colorModel":"rgba","format":"png","height":738,"width":1280}"
					#'returnBody' => json_encode(array(
					#		'bucket' => '$(bucket)', 'key' => '$(key)', 'etag' => '$(etag)',
					#		# 'exif' => '$(exif)',
					#		# 'imageInfo' => '$(imageInfo)',
					#)),
					'fsizeLimit'=> 4194304, // 单位：字节（Byte）
					// 自定义变量形如： $(x:module), $(x:orig_name), $(x:member_id), $(x:upload_from), 
					'returnBody' => '{"mav":$(x:hshs),"bucket":$(bucket),"key":$(key),"hash":$(etag),"etag":$(etag),"fname":$(fname),"fsize":$(fsize),"mimeType":$(mimeType),"endUser":$(endUser),"exif":$(exif),"imageInfo":$(imageInfo),"year":$(year),"min":$(min),"imageAve":$(imageAve),"ext":$(ext),"uuid":$(uuid)}',
			);
			// 构建鉴权对象 - 需要填写你的 Access Key 和 Secret Key
			$auth = new Auth($config['access_key'], $config['secret_key']);
			// 生成上传 Token
			$token = $auth->uploadToken($bucket, null, 3600, $policy);
			// 要上传文件的本地路径, eg: './php-logo.png';
			$filePath = $content['full_path']; // not file_path
			// 上传到七牛后保存的文件名
			$key = 'upload/'.$filter.'/'.date('Ymd').'/'.basename($filePath);
			
			// 调用 UploadManager 的 putFile 方法进行文件的上传
			list($retBody, $orError) = $uploadManager->putFile($token, $key, $filePath);
			if ($orError !== null) {
				# assert($orError instanceof Qiniu\Http\Error, 'Something Error must was occured in Qiniu!');
				// $orError instanceof Qiniu\Http\Error;
				// var_dump($orError->code(), $orError->message()); print_r($orError->getResponse());
				log_message('error', sprintf('Qiniu\Http\Error { %s } occured in Qiniu\Storage\UploadManager::putFile().', var_export($orError, true)));
				$message = $orError->message();
				return [false, [$message]];
			} else {
				// 删除本地服务器的图片
				unlink($filePath);
				$content = array_merge($content, $retBody);
				//print_r($retBody);
				# 对于 $retBody 中的数据项： key 是我们定制的，便于迁移，但是在七牛中可以改；hash 是不会变的，但是不便迁移。
				$content['url'] = $config['domain_base'] . $retBody['key'];
				// 记录日志 - 更新日志
				//print_r($retBody);return;
			}
			
			return [$status, $content];
		}
	}




}